home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 051-075 / disk_056 / mergemem / mergemem.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  3KB  |  78 lines

  1. /* MergeMem.c - by  Carolyn Scheppner  CBM  02/87
  2.  *  Attempts to merge the memlists of sequentially configged ram boards
  3.  *  which have the same Attributes (for contiguous expansion ram)
  4.  *
  5.  *  Note:  This program has been tested with an Alegra plugged into
  6.  *         a Microbotics Starboard's pass-thru.  The program makes
  7.  *         the assumption that sequentially configged ram boards
  8.  *         have sequential entries in the MemHeader list.  If this
  9.  *         is not always true, then this program may not work for
  10.  *         some expansion configurations.  Works fine for me though.
  11.  */
  12.  
  13. #include "exec/types.h"
  14. #include "exec/exec.h" 
  15. #include "exec/execbase.h" 
  16.  
  17. extern struct ExecBase *SysBase;
  18.  
  19. main()
  20.    {
  21.    struct MemChunk *chunk;
  22.    struct MemHeader *mem, *firstmem, *prevmem = 0;
  23.    struct ExecBase *eb = SysBase;
  24.    ULONG  memsize;
  25.  
  26.    /* Temps */
  27.    struct MemChunk *oldFirst;
  28.    APTR   oldLower, oldUpper;
  29.    ULONG  oldFree;
  30.  
  31.    Forbid();
  32.    firstmem = (struct MemHeader *)eb->MemList.lh_Head;
  33.  
  34.    /* Go to end of MemHeader list */
  35.    for (mem = firstmem;
  36.            mem->mh_Node.ln_Succ;
  37.               mem = (struct MemHeader *)mem->mh_Node.ln_Succ)
  38.       printf("Found memory type $%lx at $%lx\n",mem->mh_Attributes,mem);
  39.  
  40.    /* Back up from terminal node to point at last MemHeader */
  41.    mem = (struct MemHeader *)mem->mh_Node.ln_Pred;
  42.  
  43.    /* Backwards, for each except first */
  44.    for ( ; (ULONG)mem != (ULONG)firstmem; mem = prevmem)
  45.       {
  46.       prevmem = (struct MemHeader *)mem->mh_Node.ln_Pred;
  47.  
  48.       /* If prev MemHeader describes neighboring ram of same Attributes */
  49.       if(((ULONG)prevmem->mh_Upper == (ULONG)mem->mh_Lower - 32L)&&
  50.            (prevmem->mh_Attributes == mem->mh_Attributes))
  51.          {
  52.          printf("Merging $%lx with $%lx\n",prevmem,mem);
  53.          /* Save needed stuff from MemHeader before Remove()ing it */
  54.          oldFirst = mem->mh_First;
  55.          oldLower = mem->mh_Lower;
  56.          oldUpper = mem->mh_Upper;
  57.          oldFree  = mem->mh_Free;
  58.          Remove(mem);
  59.  
  60.          /* Adjust Upper and Free in prev MemHeader to include this mem */
  61.          memsize = (ULONG)oldUpper - (ULONG)oldLower +32L;
  62.          prevmem->mh_Upper = (APTR)((ULONG)prevmem->mh_Upper + memsize);
  63.          prevmem->mh_Free += oldFree;
  64.  
  65.          /* Link last free chunk of prevmem to first free of mem */
  66.          for (chunk = prevmem->mh_First;
  67.                   chunk->mc_Next; chunk = chunk->mc_Next);
  68.          chunk->mc_Next = oldFirst;
  69.  
  70.          /* Now FreeMem() the old MemHeader as a 32 byte chunk */
  71.          FreeMem(mem,32);
  72.          }
  73.       }
  74.    Permit();
  75.    }
  76.  
  77.  
  78.